#include <REGX52.H>

sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;

/** @bref I2C开始（SCL高电平期间，SDA从高电平切换到低电平）
  * @param 无
  * @retval 无
  */
void I2C_Start()
{
	I2C_SDA = 1;
	I2C_SCL = 1;
	I2C_SDA = 0;
	I2C_SCL = 0;	
}

/** @bref I2C结束（SCL高电平期间，SDA从低电平切换到高电平）
  * @param 无
  * @retval 无
  */
void I2C_Stop()
{
	I2C_SDA = 0;
	I2C_SCL = 1;
	I2C_SDA = 1;
}

/** @bref I2C发送一个字节
  * @param 发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char byte)
{
	unsigned char i = 0;
	for(i = 0; i < 8; i++)
	{
		// 把byte的第i位赋给I2C_SDA
		I2C_SDA = byte & (0x80 >> i);
		I2C_SCL = 1;
		I2C_SCL = 0;
	}
}

/** @bref I2C接受一个字节
  * @param 无
  * @retval 接受到的字节
  */
unsigned char I2C_ReceiveByte()
{
	unsigned char byte = 0x00;
	unsigned char i = 0;
	
	// 主机在接收之前，需要释放SDA
	I2C_SDA = 1;

	for(i = 0; i < 8; i++)
	{
			I2C_SCL = 1;
		
			// 若I2C_SDA读取为1，则把byte的第i位置1，否则默认为0
			if(I2C_SDA)
			{
				byte |= (0x80 >> i);
			}
			
			I2C_SCL = 0;
	}
	
	return byte;
}

/** @bref I2C发送应答
	* @param ack为应答位，0为应答，1为非应答
  * @retval 无
  */
void I2C_sendACK(unsigned char ack)
{
	I2C_SDA = ack;
	I2C_SCL = 1;
	I2C_SCL = 0;
}

/** @bref I2C接收应答
  * @param 无
  * @retval 接收到的应答，0为应答，1为非应答
  */
unsigned char receiveACK()
{
	unsigned char ack;
	
	// 主机在接收之前，需要释放SDA
	I2C_SDA = 1;
	I2C_SCL = 1;
	ack = I2C_SDA;
  I2C_SCL	= 0;
	
	return ack;
}